package com.liuguang.rabbitmq.comsumer;

import com.liuguang.common.constans.CommonConstans;
import com.liuguang.common.pojo.CommonResult;
import com.liuguang.common.pojo.MqData;
import com.liuguang.rabbitmq.service.SendEmailService;
import com.rabbitmq.client.Channel;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import java.io.IOException;

/**
 * @ClassName: EmailListener
 * @Description：
 * @Author: wanghr
 * Date: 2:04 PM 2020/10/14
 * Version: 1.0
 */
@Component
public class EmailListener {
    private static final Logger logger = LoggerFactory.getLogger(EmailListener.class);

    @Autowired
    private SendEmailService sendEmailService;

    //todo: 使用 derict 模式，当消息在方法中抛出异常，那么消息不能被消费会一直接收，对应着后序业务出现异常，那么会一直重试
    //当存在多个消费者监听这个队列的时候，当得到消息的消费者出现异常的时候，broker 会将消息转发给下个消费者，直到消息被处理
    //当只有一个消费者监听队列，那么会不断的向该消费者发送消息，一直重试
//    @RabbitListener(queues = CommonConstans.EMAIL_QUEUE_NAME)
    public void receiveMessage(Channel channel, MqData mqData) throws IOException {
        logger.info("接收发送邮件消息：{}", mqData);
        CommonResult result = null;
        try {
            result = sendEmailService.sendEmail(mqData);
        } catch (Exception e) {
            logger.info("邮件发送失败");
        }
        if (result.getCode() == 200) {
            logger.info("邮件发送成功");
        //channel.basicAck(message.getMessageProperties().getDeliveryTag(),false);
        } else {
            logger.info("邮件发送失败");
        }

    }

    /**
     * 当有多个监听器监听同一个队列，时候会负载均衡，只有一个能接受到消息
     *
     * @params: [mqData]
     * @return: void
     */
//    @RabbitListener(queues = CommonConstans.EMAIL_QUEUE_NAME)
    public void receiveMessage1(MqData mqData) {
        logger.info("发送邮件接收消息，消耗mq 中消息");
    }
}
